class Student:
    def __init__(self, name, age, score):
        self._name = name  # self._name 受保护的，只能是本类和子类访问 和 java中 protected
        self.__age = age  # self.__age 私有的只能是类本身访问 private 私有的
        self.__score__ = score  # 表示特殊方法 普通的实例属性。类的外部、内部、子类都可以访问

    def _fun1(self):
        print('projected 受保护的 只能是本垒和子类访问')

    def __fun2(self):
        print('private 私有的，只能是本类才能访问')

    def __fun3__(self):
        print("特殊方法，普通的实例属性。类的外部，内部，子类都可以访问")

    def valName(self):
        return self._name

    def valAge(self):
        return self.__age

    def showFun1(self):
        self._fun1()

    def showFun2(self):
        self.__fun2()


if __name__ == '__main__':
    stu1 = Student('马迪迪', 23, 99.1)
    print(stu1.__score__, stu1.valName(), stu1.valAge())
    stu1.showFun1()
    stu1.showFun2()
    # stu1.__fun2() # Student' object has no attribute '__fun2'. Did you mean: '_fun1'?
    stu1.__fun3__()

    # 访问私有的方法和属性
    print(stu1._Student__age)
    stu1._Student__fun2()
    print(stu1._name)

    print(dir(stu1))
